package com.cskaoyan.javase.oop2._1extends._4hierarchy;

/**
 * 继承层次
 * 思考1:
 * Java中的一个类,可以使用"extends"关键字,直接继承多个类吗?
 *      不可以
 * 像Java这种，只能有一个直接父类，而不能有两个或更多的设计，称之为"单重继承"或者"单继承"。一个类最多只有一个直接父类
 *
 *与之相对应的,就是C++中的多继承，一个类可以直接继承多个类，就称之为"多重继承"或者"多继承"。
 *
 * 思考2：
 * Java中的一个类，就只能有一个父类吗？
 * 直接父类肯定只有一个，但是父类还有父类，这样的类就是该类的间接父类
 * 于是就形成了下面几个概念：
 *      1.祖先类：处在继承顶层的类。
 *      2.继承层次（hierarchy）：由某个祖先类派生出来的所有类的集合叫做继承层次。
 *      3.继承链：从某一个子类开始，到其祖先类的路径。
 *
 * 继承层次中需要注意的地方：
 * 1.在一条继承链中，总称呼下游类是上游类的子类，不管隔了几层。没有孙子类或者重孙类这种概念。
 * 2.在一条继承链中的，下游的类总是继承上游类的所有成员，不管隔了几层。
 * 3.在一条继承链中，下游类总可以看成一个上游类，存在"is-a"关系。
 * 4.不在同一条继承链中的类，没有任何关系。虽然看起来像"兄弟姐妹"类，但是Java是不讲究血统的。
 *
 * 扩展:
 * 在Java的设计体系当中,java.lang.Object类是顶层的祖先类
 * Java中的所有类包括数组,都会继承Object
 * 它的继承,可以是直接继承:
 * 只要某个类没有使用extends关键字,明确继承了某个类,那么他就继承Object
 *      这是一个隐式继承,没有必要写出来
 *      比如下面代码中Demo类,Grandfather类
 * 也可以间接继承
 *      比如Uncle,Father...Grandson这些类都是间接继承Object
 *
 * @since 16:00
 * @author wuguidong@cskaoyan.onaliyun.com
 */
// Class 'detail' explicitly extends 'java.lang.Object'
public class Demo {
    public static void main(String[] args) {
        // gs对象会继承上游父类的所有成员
        // Grandson gs = new Grandson();
        // gs.uvar

        // 思考：在这个案例中，创建Grandson对象有几种方式？
        // 四种 Grandfather、Father、Son以及Grandson四个引用都可以指向它的对象
        // 如果算上Object,就是五种,实际上Object引用可以指向任意对象

        Father fgs = new Grandson();

        Object o = fgs;
        o = new int[3];
    }
}

// Cyclic inheritance involving 'com.cskaoyan.javase.oop2._1extends._4hierarchy.Grandfather'
class Grandfather {
    int gfVar;
}

class Uncle extends Grandfather {
    int uVar;
}

class Father extends Grandfather {
    int fVar;
}

class Son extends Father {
    int sVar;
}

class Grandson extends Son {
    int gsVar;
}


// class Father2{}
// Class cannot extend multiple classes
// class Son extends Father,Father2{}
